package com.edu.exam.entity.grading.audit;

import com.edu.exam.enums.grading.AuditStatType;
import com.edu.exam.enums.grading.StatDimension;
import com.edu.exam.enums.grading.StatUnit;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 成绩审核统计实体类
 *
 * <p>成绩审核统计实体用于存储审核过程的统计分析数据，包含
 * 效率统计、时间统计、工作量统计、质量分析等。为审核管理提供数据支持和决策依据。</p>
 *
 * <p>所属模块：B-06 成绩管理模块</p>
 * <p>对应数据库表：grade_audit_statistics</p>
 *
 * <p>核心功能：
 * - 效率统计：统计审核的效率和成功率
 * - 时间统计：统计审核的时间分布和耗时
 * - 工作量统计：统计审核人员的工作量
 * - 质量分析：分析审核质量和准确性
 * - 趋势分析：分析审核数据的趋势变化</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Entity
public class GradeAuditStatistics {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 统计类型
     *
     * <p>统计数据的类型。
     * 支持的类型：EFFICIENCY（效率统计）、WORKLOAD（工作量统计）、QUALITY（质量统计）、TIME（时间统计）、TREND（趋势统计）、OVERVIEW（总览统计）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "stat_type", nullable = false, length = 30)
    private AuditStatType statType;

    /**
     * 统计键
     *
     * <p>统计数据的键标识。</p>
     */
    @Column(name = "stat_key", nullable = false, length = 100)
    private String statKey;

    /**
     * 统计值
     *
     * <p>统计的具体数值。</p>
     */
    @Column(name = "stat_value", nullable = false, precision = 15, scale = 2)
    private BigDecimal statValue;

    /**
     * 统计维度
     *
     * <p>统计数据的维度。
     * 支持的维度：DAILY（每日）、WEEKLY（每周）、MONTHLY（每月）、QUARTERLY（每季度）、YEARLY（每年）、AUDITOR（审核人）、COURSE（课程）、TASK_TYPE（任务类型）、PRIORITY（优先级）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "dimension", nullable = false, length = 20)
    private StatDimension dimension = StatDimension.DAILY;

    /**
     * 统计日期
     *
     * <p>统计数据对应的日期。</p>
     */
    @Column(name = "stat_date", nullable = false)
    private LocalDate statDate;

    /**
     * 统计周期开始时间
     *
     * <p>统计周期的开始时间。</p>
     */
    @Column(name = "period_start")
    private LocalDate periodStart;

    /**
     * 统计周期结束时间
     *
     * <p>统计周期的结束时间。</p>
     */
    @Column(name = "period_end")
    private LocalDate periodEnd;

    /**
     * 课程ID
     *
     * <p>关联的课程ID。</p>
     */
    @Column(name = "course_id", length = 50)
    private String courseId;

    /**
     * 课程名称
     *
     * <p>关联的课程名称。</p>
     */
    @Column(name = "course_name", length = 200)
    private String courseName;

    /**
     * 班级ID
     *
     * <p>关联的班级ID。</p>
     */
    @Column(name = "class_id", length = 50)
    private String classId;

    /**
     * 班级名称
     *
     * <p>关联的班级名称。</p>
     */
    @Column(name = "class_name", length = 200)
    private String className;

    /**
     * 审核人ID
     *
     * <p>关联的审核人ID。</p>
     */
    @Column(name = "auditor_id", length = 50)
    private String auditorId;

    /**
     * 审核人姓名
     *
     * <p>关联的审核人姓名。</p>
     */
    @Column(name = "auditor_name", length = 100)
    private String auditorName;

    /**
     * 任务类型
     *
     * <p>关联的任务类型。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "task_type", length = 30)
    private String taskType;

    /**
     * 优先级
     *
     * <p>关联的优先级。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "priority", length = 10)
    private String priority;

    /**
     * 统计单位
     *
     * <p>统计值的单位。
     * 支持的单位：COUNT（个数）、PERCENTAGE（百分比）、MINUTES（分钟）、HOURS（小时）、DAYS（天数）、SCORE（分数）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "stat_unit", length = 20)
    private StatUnit statUnit = StatUnit.COUNT;

    /**
     * 基准值
     *
     * <p>用于比较的基准值。</p>
     */
    @Column(name = "baseline_value", precision = 15, scale = 2)
    private BigDecimal baselineValue;

    /**
     * 同比增长率
     *
     * <p>与基准值的同比增长率。</p>
     */
    @Column(name = "growth_rate", precision = 8, scale = 2)
    private BigDecimal growthRate;

    /**
     * 统计详情
     *
     * <p>统计的详细信息，JSON格式存储。</p>
     */
    @Column(name = "stat_details", columnDefinition = "TEXT")
    private String statDetails;

    /**
     * 对比数据
     *
     * <p>用于对比的历史数据，JSON格式存储。</p>
     */
    @Column(name = "comparison_data", columnDefinition = "TEXT")
    private String comparisonData;

    /**
     * 统计标签
     *
     * <p>JSON格式的统计标签，用于分类和过滤。</p>
     */
    @Column(name = "stat_tags", columnDefinition = "TEXT")
    private String statTags;

    /**
     * 统计备注
     *
     * <p>统计的备注信息。</p>
     */
    @Column(name = "stat_notes", columnDefinition = "TEXT")
    private String statNotes;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建用户ID
     */
    @Column(name = "create_user_id", length = 50)
    private String createUserId;

    /**
     * 更新用户ID
     */
    @Column(name = "update_user_id", length = 50)
    private String updateUserId;

    /**
     * 版本号（乐观锁）
     */
    @Version
    @Column(name = "version")
    private Integer version = 0;

    /**
     * 逻辑删除标记
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;
}